package com.android.kotlincoroutinemvvmdemo.view
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.util.AttributeSet
import com.android.kotlincoroutinemvvmdemo.R

/*
* EyeProtectionView
* */

/*
    * PorterDuff作用场景:在原有图像上绘制其他内容

      PorterDuff.Mode为枚举类,一共有16个枚举值:
      1.PorterDuff.Mode.CLEAR
      所绘制不会提交到画布上。
      *
      2.PorterDuff.Mode.SRC
      显示上层绘制图片
      *
      3.PorterDuff.Mode.DST
      显示下层绘制图片
      *
      4.PorterDuff.Mode.SRC_OVER
      正常绘制显示，上下层绘制叠盖。
      *
      5.PorterDuff.Mode.DST_OVER
      上下层都显示。下层居上显示。
      *
      6.PorterDuff.Mode.SRC_IN
      取两层绘制交集。显示上层。
      *
      7.PorterDuff.Mode.DST_IN
      取两层绘制交集。显示下层。
      *
      8.PorterDuff.Mode.SRC_OUT
      取上层绘制非交集部分。
      *
      9.PorterDuff.Mode.DST_OUT
      取下层绘制非交集部分。
      *
      10.PorterDuff.Mode.SRC_ATOP
      取下层非交集部分与上层交集部分
      *
      11.PorterDuff.Mode.DST_ATOP
      取上层非交集部分与下层交集部分
      *
      12.PorterDuff.Mode.XOR
      异或：去除两图层交集部分
      *
      13.PorterDuff.Mode.DARKEN
      取两图层全部区域，交集部分颜色加深
      *
      14.PorterDuff.Mode.LIGHTEN
      取两图层全部，点亮交集部分颜色
      *
      15.PorterDuff.Mode.MULTIPLY
      取两图层交集部分叠加后颜色
      *
      16.PorterDuff.Mode.SCREEN
      取两图层全部区域，交集部分变为透明色
    * */
class EyeProtectionView @JvmOverloads constructor(
    context: Context,
    attributeSet: AttributeSet? = null
) : BaseView(context, attributeSet) {

    private val mStrokeWidth = context.resources.getDimension(R.dimen.dp_2)

    private val mPaint0 by lazy {
        Paint().apply {
            isAntiAlias = true
            isDither = true
            strokeWidth = mStrokeWidth
            style = Paint.Style.STROKE
            color = context.resources.getColor(R.color.color_4CF803)
        }
    }

    private val mPaint1 by lazy {
        Paint().apply {
            isAntiAlias = true
            isDither = true
            color = context.resources.getColor(R.color.color_EB37F8)
        }
    }

    private val degrees = floatArrayOf(0F, 180F)

    private val porterDuffMode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT)

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        setBackgroundColor(context.resources.getColor(R.color.color_F3F3F3))
        canvas?.apply {
            val cx = mWidth.toFloat() / 2
            val cy = mHeight.toFloat() / 2
            translate(cx, cy)

            val remainValue= ((cx - mStrokeWidth) * Math.cos(Math.toRadians(45.0)) / 2).toFloat()
            val translateY = cy - remainValue
            for (degree in degrees) {
                save()
                translate(0F, translateY * Math.cos(Math.toRadians(degree * 1.0)).toFloat())
                rotate(degree)
                drawArc(
                    -cx + mStrokeWidth,
                    -cy + mStrokeWidth,
                    cx - mStrokeWidth,
                    cy - mStrokeWidth,
                    225F,
                    90F,
                    false,
                    mPaint0
                )
                restore()
            }

            val layerId = saveLayer(-cx, -cy, cx, cy, null)
            drawCircle(
                0F,
                0F,
                remainValue / 2,
                mPaint1
            )
            mPaint1.xfermode = porterDuffMode
            drawCircle(
                -cx / 8,
                -cy / 8,
                remainValue / 2,
                mPaint1
            )
            mPaint1.xfermode = null
            restoreToCount(layerId)
        }
    }
}